package helpers;
import java.util.StringTokenizer;
import main.IntegerP;
import main.RealP;
public class Operations {
private static RealP Remain = new RealP();
private static int max(int a, int b) {
if (a > b)
return a;
else
return b;
}
public static int evaluateI(IntegerP A, int x) {
int result = 0, i, j, pow = 1;
for (i = 0; i <= A.getN(); i++) {
for (j = 0; j < i; j++)
pow = pow * x;
result += A.coef[i]*pow;
pow = 1;
}
return result;
}
public static float evaluateR(RealP A, int x) {
int i, j, pow = 1;
float result = 0;
for (i = 0; i <= A.getN(); i++) {
for (j = 0; j < i; j++)
pow = pow * x;
result += A.coef[i]*pow;
pow = 1;
}
return result;
}
public static RealP addP(RealP A, RealP B) {
RealP Result = new RealP();
int i, n = max(A.getN(), B.getN());
for (i = 0; i <= n; i++) {
Result.coef[i] = A.coef[i] + B.coef[i];
}
Result.setN(n);
return Result;
}
public static RealP subP(RealP A, RealP B) {
RealP Result = new RealP();
int i;
Result = A;
for (i = 0; i <= B.getN(); i++)
Result.coef[i] -= B.coef[i];
i = max(A.getN(), B.getN());
Result.setN(i);
while (i >= 0 && Result.coef[i] == 0) {
i--;
Result.setN(i);
}
return Result;
}
public static RealP integrateR(RealP A, int C) {
RealP Result = new RealP();
float aux;
if (A.getN() != 11) {
int i;
for (i = A.getN(); i >= 0; i--) {
aux = A.coef[i];
Result.coef[i + 1] = aux / (i + 1);
}
Result.coef[0] = C;
Result.setN(A.getN() + 1);
}
return Result;
}
public static IntegerP derivateI(IntegerP A) {
IntegerP Result = new IntegerP();
int i;
if (A.getN() > 0)
for (i = 0; i < A.getN(); i++) {
Result.coef[i] = A.coef[i + 1] * (i + 1);
}
else if (A.getN() == 0)
Result.coef[0] = 0;
if (A.getN() > 0)
Result.setN(A.getN() - 1);
return Result;
}
public static RealP derivateR(RealP A) {
RealP Result = new RealP();
int i;
if (A.getN() > 0)
for (i = 0; i < A.getN(); i++) {
Result.coef[i] = A.coef[i + 1] * (i + 1);
}
else if (A.getN() == 0)
Result.coef[0] = 0;
if (A.getN() > 0)
Result.setN(A.getN() - 1);
return Result;
}
public static IntegerP toPolynomI(String S) {
IntegerP A = new IntegerP();
int coef, n = 0;
boolean first = true;
String Saux;
S = S.replace(" ", "");
S = S.replace("x", "X");
S = S.replace("X^", "X");
S = S.replace("-X", "-1X");
S = S.replace("+X", "+1X");
S = S.replace("-", "+-");
S = S.replace("X+", "X1+");
StringTokenizer Ss = new StringTokenizer(S, "+");
while (Ss.hasMoreElements()) {
Saux = Ss.nextToken();
if (Saux.contains("X")) {
if (Saux.startsWith("X") && Saux.endsWith("X")) {
n = 1;
A.coef[n] = 1;
} else if (Saux.endsWith("X")) {
n = 1;
Saux = Saux.substring(0, Saux.length() - 1);
A.coef[n] = Integer.parseInt(Saux);
} else if (Saux.startsWith("X")) {
Saux = Saux.substring(1);
n = Integer.parseInt(Saux);
A.coef[n] = 1;
} else {
StringTokenizer Sb = new StringTokenizer(Saux, "X");
coef = Integer.parseInt(Sb.nextToken());
n = Integer.parseInt(Sb.nextToken());
A.coef[n] = coef;
}
if (first) {
first = false;
A.setN(n);
}
} else {
A.coef[0] = Integer.parseInt(Saux);
}
}
return A;
}
public static RealP toPolynomR(String S) {
RealP A = new RealP();
int n = 0;
float coef;
boolean first = true;
String Saux;
S = S.replace(" ", "");
S = S.replace("x", "X");
S = S.replace("X^", "X");
S = S.replace("-X", "-1X");
S = S.replace("+X", "+1X");
S = S.replace("-", "+-");
S = S.replace("X+", "X1+");
StringTokenizer Ss = new StringTokenizer(S, "+");
while (Ss.hasMoreElements()) {
Saux = Ss.nextToken();
if (Saux.contains("X")) {
if (Saux.startsWith("X") && Saux.endsWith("X")) {
n = 1;
A.coef[n] = 1;
} else if (Saux.endsWith("X")) {
n = 1;
Saux = Saux.substring(0, Saux.length() - 1);
A.coef[n] = Float.parseFloat(Saux);
} else if (Saux.startsWith("X")) {
Saux = Saux.substring(1);
n = Integer.parseInt(Saux);
A.coef[n] = 1;
} else {
StringTokenizer Sb = new StringTokenizer(Saux, "X");
coef = Float.parseFloat(Sb.nextToken());
n = Integer.parseInt(Sb.nextToken());
A.coef[n] = coef;
}
if (first) {
first = false;
A.setN(n);
}
} else {
A.coef[0] = Float.parseFloat(Saux);
}
}
return A;
}
private static String coefSel(int coef) {
String S = "";
if (coef > 0)
if (coef == 1)
S += "+X";
else
S += "+" + coef + "X";
else if (coef < 0)
if (coef == -1)
S += "-X";
else
S += coef + "X";
return S;
}
public static String toStringI(IntegerP A) {
String s = "";
if (A.getN() > 0) {
for (int i = A.getN(); i >= 2; i--)
if (A.coef[i] != 0)
s += coefSel(A.coef[i]) + "^" + i;
if (A.coef[1] != 0)
s += coefSel(A.coef[1]);
if (A.coef[0] > 0)
s += "+" + A.coef[0];
else if (A.coef[0] < 0)
s += A.coef[0];
if (A.coef[A.getN()] > 0)
s = s.substring(1);
} else
s += A.coef[0];
return s;
}
private static String coefSel(float coef) {
String S = "";
if (coef > 0)
if (coef == 1)
S += "+X";
else
S += "+" + coef + "X";
else if (coef < 0)
if (coef == -1)
S += "-X";
else
S += coef + "X";
return S;
}
public static String toStringR(RealP A) {
String s = "";
if (A.getN() > 0) {
for (int i = A.getN(); i >= 2; i--)
if (A.coef[i] != 0)
s += coefSel(A.coef[i]) + "^" + i;
if (A.coef[1] != 0)
s += coefSel(A.coef[1]);
if (A.coef[0] > 0)
s += "+" + A.coef[0];
else if (A.coef[0] < 0)
s += A.coef[0];
if (A.coef[A.getN()] > 0)
s = s.substring(1);
} else
s += A.coef[0];
return s;
}
public static RealP mulP(RealP A, RealP B) {
RealP Result = new RealP();
int i, j;
for (i = 0; i <= 11; i++)
Result.coef[i] = 0;
for (i = 0; i <= A.getN(); i++)
for (j = 0; j <= B.getN(); j++)
Result.coef[i + j] += A.coef[i] * B.coef[j];
Result.setN(A.getN() + B.getN());
return Result;
}
public static RealP toRealP(IntegerP A) {
RealP R = new RealP();
for (int i = 0; i <= A.getN(); i++)
R.coef[i] = A.coef[i];
R.setN(A.getN());
return R;
}
public static IntegerP toIntegerP(RealP A) {
IntegerP R = new IntegerP();
for (int i = 0; i <= A.getN(); i++)
R.coef[i] = Math.round(A.coef[i]);
R.setN(A.getN());
return R;
}
public static RealP divP(RealP A, RealP B) {
RealP C = new RealP();
RealP Res = new RealP();
if (B.getN() == 0 && B.coef[0] == 0)
throw new RuntimeException("Divide by zero polynomial");
if (A.getN() < B.getN()) {
setRemain(A);
return C;
}
C.setN(A.getN() - B.getN());
C.coef[C.getN()] = A.coef[A.getN()] / B.coef[B.getN()];
Res = mulP(C, B);
Res = subP(A, Res);
Res = divP(Res, B);
Res = addP(C, Res);
return Res;
}
public static RealP getRemain() {
return Remain;
}
public static void setRemain(RealP remain) {
Remain = remain;
}
}